package negocio;

import java.sql.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.GregorianCalendar;

import persistencia.ClaseDAO;
import persistencia.SalaDAO;

public class ClaseControlador 
{
	public static ArrayList<Clase> getClases(Cursada cursada)
	{
		return ClaseDAO.getInstance().getClases(cursada);
	}
	
	public static void guardar(Clase clase)
	{
		ClaseDAO.getInstance().guardar(clase);
	}
	
	@SuppressWarnings("deprecation")
	public static ArrayList<Clase> generarClases(boolean[] diasSemana,ArrayList<Time> horasInicio, ArrayList<Time> horasFin, 
			Cursada cursada, ArrayList<Sala> salas, int horasTotales)
	{
		java.sql.Date inicioCursada = cursada.getFechaInicio();//fecha de inicio de la cursada.
		ArrayList<Clase> res = new ArrayList<Clase>();//Clases generadas a devolver.
		ArrayList<GregorianCalendar> calendarios = new ArrayList<GregorianCalendar>();//clendarios para el control de las fechas.
		ArrayList<Integer> dias = new ArrayList<Integer>();//Los dias de la semana en los que hay clases.
		//Inicializo los calendarios en la fecha de inicio de la cursada.
		for(int i=0;i<7;i++)
		{
			if(diasSemana[i])
			{
				GregorianCalendar cal =  new GregorianCalendar(inicioCursada.getYear()+1900, inicioCursada.getMonth(), inicioCursada.getDate());
				primeraClase(i, cal);//
				calendarios.add(cal);
				dias.add(new Integer(i));
			}
		}
		
		int primerDiaClases = 0;
		GregorianCalendar cal = new GregorianCalendar(inicioCursada.getYear()+1900, inicioCursada.getMonth(), inicioCursada.getDate());
		boolean b = true;
		while(b)
		{
			int d = cal.get(Calendar.DAY_OF_WEEK)-1;
			if(-1!=dias.indexOf(d))
			{
				primerDiaClases = dias.indexOf(d);

				b = false;
			}
			else
			{
				cal.add(Calendar.DAY_OF_MONTH, 1);
			}
		}
		
		long horas = horasTotales*3600000;
		while(horas>0)
		{
			for(int i = primerDiaClases;i<calendarios.size();i++)
			{
				if(horas>0)
				{
					Time inicio = horasInicio.get(dias.get(i));// hora inicio de la clase.
					Time fin = horasFin.get(dias.get(i)); //hora fin de la clase
					GregorianCalendar gc = calendarios.get(i);
					Date date = new Date(gc.get(Calendar.YEAR)-1900,gc.get(Calendar.MONTH), gc.get(Calendar.DATE));//fecha para la clase	
					if(salas.get(dias.get(i))!=null)
						res.add(new Clase(cursada, date, inicio, fin,"Pendiente", salas.get(dias.get(i))));
					else
						res.add(new Clase(cursada, date, inicio, fin,"Pendiente", null));
					horas = horas-(fin.getTime() - inicio.getTime()) ;//resto el tiempo entre fin e inicio.
					gc.add(Calendar.DAY_OF_MONTH, 7);
				}
			}
			primerDiaClases = 0;
		}
		Collections.sort(res);
		return res;
	}
	
	@SuppressWarnings("deprecation")
	private static void primeraClase(int diaSemana, GregorianCalendar calendario)
	{
		int dia = calendario.get(Calendar.DAY_OF_WEEK)-1;
		while(dia != diaSemana)
		{
			calendario.add(Calendar.DAY_OF_MONTH,1);
			dia = calendario.get(Calendar.DAY_OF_WEEK)-1;
		}
	}
	
	public static ArrayList<Clase> getClasesPorSala(Sala sala)
	{
		return ClaseDAO.getInstance().getClasesPorSala(sala);
	}

	public static ArrayList<Clase> getClasesPorInstructor(Usuario instructor) {
		return ClaseDAO.getInstance().getClasesPorInstructor(instructor);
	}
		
	public static void setInstructor(Clase clase, Usuario instructor)
	{
		ClaseDAO.getInstance().setInstructor(clase, instructor);
	}
	
	public static void setEstado(Clase clase, String estado)
	{
		ClaseDAO.getInstance().setEstado(clase, estado);
	}
	
	public static void setSala(Clase clase, Sala sala)
	{
		ClaseDAO.getInstance().setSala(clase, sala);
	}

	public static void cambiarEstado(Clase clase, String estado) {
		ClaseDAO.getInstance().cambiarEstado(clase, estado);
		
	}
}
